package com.changgou.goods.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.entity.IdWorker;
import com.changgou.goods.dao.BrandMapper;
import com.changgou.goods.dao.CategoryMapper;
import com.changgou.goods.dao.SkuMapper;
import com.changgou.goods.dao.SpuMapper;
import com.changgou.goods.pojo.Goods;
import com.changgou.goods.pojo.Sku;
import com.changgou.goods.pojo.Spu;
import com.changgou.goods.service.SpuService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/****
 * @Author:shenkunlin
 * @Description:Spu业务层接口实现类
 * @Date 2019/6/14 0:16
 *****/
@Service
public class SpuServiceImpl implements SpuService {

    @Autowired(required = false)
    private SpuMapper spuMapper;

    @Autowired(required = false)
    private SkuMapper skuMapper;

    @Autowired(required = false)
    private CategoryMapper categoryMapper;

    @Autowired(required = false)
    private BrandMapper brandMapper;

    @Autowired
    private IdWorker idWorker;





/**
 * TODO   根据SpuID查询goods信息
 * @param:  [Id]
 * @return: com.changgou.goods.com.changgou.seckill.pojo.Goods
 * @Author  YPK
 * @Date:   2019/11/14 16:40
 * @Version: 1.0
 */
    @Override
    public Goods findGoodsById(Long Id) {
        Spu spu = spuMapper.selectByPrimaryKey(Id);

        Sku sku = new Sku();
        sku.setSpuId(Id);
        List<Sku> skus = skuMapper.select(sku);

        //封装Goods
        Goods goods = new Goods();

        goods.setSkuList(skus);
        goods.setSpu(spu);
        return goods;


    }

    /* TODO 保存Goods 保存商品
     * @param: [goods]
     * @return: void
     * @auther: YPK
     * @date: 2019/11/13 19:42
     * @Version: 1.0
     */

    @Override
    public void saveGoods(Goods goods) {
        //1、保存商品基本信息（SPU）
        Spu spu = goods.getSpu();
        if (!StringUtils.isEmpty(spu.getId())){ // 更新
            // 待审核
            spu.setStatus("0");
            // 库存：先删除，在插入
            spuMapper.updateByPrimaryKeySelective(spu);

            // 删除原有的库存
            Sku sku = new Sku();
            sku.setSpuId(spu.getId());
            skuMapper.delete(sku);
        }else{ // 保存
            long spuId = idWorker.nextId();
            spu.setId(spuId);
            spu.setIsMarketable("0");   // 上架状态：0：未上架  1：已上架  2：已下架
            spu.setIsDelete("0");       // 商品的删除状态：未删除
            spu.setStatus("0");         // 商品的审核状态：待审核
            spuMapper.insertSelective(spu);
        }

        // 保存sku（库存信息）

        List<Sku> skuList = goods.getSkuList();
        if (skuList != null && skuList.size() > 0){
        for (Sku sku : skuList) {
            sku.setId(idWorker.nextId());// 主键
            sku.setSpuId(spu.getId());    // 商品id

            String name = spu.getName() + " " + spu.getCaption() ;   // 名称+副标题
            // 库存的商品名称 = spu名称 + spu副标题 + 规格名称  + 全网通版4GB+64GB
            //                荣耀10青春版 幻彩渐变 2400万AI自拍
            String spec = sku.getSpec();    // json串  封装  com.changgou.seckill.pojo/map  {key1:value1,key2:value2}


            // fastjson（阿里）
            Map<String, String> specMap = JSON.parseObject(spec, Map.class);

            if (specMap != null){
                Set<Map.Entry<String, String>> entries = specMap.entrySet();
                for (Map.Entry<String, String> entry : entries) {
                    name += " " + entry.getValue();
                }
            }
            sku.setName(name);              // 商品库存的名称
            sku.setCreateTime(new Date());  // 商品库存的创建日期
            sku.setUpdateTime(new Date());
            sku.setCategoryId(spu.getCategory3Id());
            // 分类名称
            sku.setCategoryName(categoryMapper.selectByPrimaryKey(spu.getCategory3Id()).getName());

            // 品牌名称
            sku.setBrandName(brandMapper.selectByPrimaryKey(spu.getBrandId()).getName());
            sku.setStatus("1"); // 库存的状态
            skuMapper.insertSelective(sku);
        }
      }
    }




    /**
     *  TODO    Spu条件+分页查询
     * @param: [spu, page, size]  TODO [ 查询条件，页码，页大小 ]
     * @return: com.github.pagehelper.PageInfo<com.changgou.goods.com.changgou.seckill.pojo.Spu>
     * @Author: YPK
     * @Date: 2019/11/14  16:57
     * @Version: 1.0
     **/
    @Override
    public PageInfo<Spu> findPage(Spu spu, int page, int size){
        //分页
        PageHelper.startPage(page,size);
        //搜索条件构建
        Example example = createExample(spu);
        //执行搜索
        return new PageInfo<Spu>(spuMapper.selectByExample(example));
    }

    /**
     * Spu分页查询
     * @param page
     * @param size
     * @return
     */
    @Override
    public PageInfo<Spu> findPage(int page, int size){
        //静态分页
        PageHelper.startPage(page,size);
        //分页查询
        return new PageInfo<Spu>(spuMapper.selectAll());
    }

    /**
     * Spu条件查询
     * @param spu
     * @return
     */
    @Override
    public List<Spu> findList(Spu spu){
        //构建查询条件
        Example example = createExample(spu);
        //根据构建的条件查询数据
        return spuMapper.selectByExample(example);
    }


    /**
     * Spu构建查询对象
     * @param spu
     * @return
     */

    public Example createExample(Spu spu){
        Example example=new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        if(spu!=null){
            // 主键
            if(!StringUtils.isEmpty(spu.getId())){
                    criteria.andEqualTo("id",spu.getId());
            }
            // 货号
            if(!StringUtils.isEmpty(spu.getSn())){
                    criteria.andEqualTo("sn",spu.getSn());
            }
            // SPU名
            if(!StringUtils.isEmpty(spu.getName())){
                    criteria.andLike("name","%"+spu.getName()+"%");
            }
            // 副标题
            if(!StringUtils.isEmpty(spu.getCaption())){
                    criteria.andEqualTo("caption",spu.getCaption());
            }
            // 品牌ID
            if(!StringUtils.isEmpty(spu.getBrandId())){
                    criteria.andEqualTo("brandId",spu.getBrandId());
            }
            // 一级分类
            if(!StringUtils.isEmpty(spu.getCategory1Id())){
                    criteria.andEqualTo("category1Id",spu.getCategory1Id());
            }
            // 二级分类
            if(!StringUtils.isEmpty(spu.getCategory2Id())){
                    criteria.andEqualTo("category2Id",spu.getCategory2Id());
            }
            // 三级分类
            if(!StringUtils.isEmpty(spu.getCategory3Id())){
                    criteria.andEqualTo("category3Id",spu.getCategory3Id());
            }
            // 模板ID
            if(!StringUtils.isEmpty(spu.getTemplateId())){
                    criteria.andEqualTo("templateId",spu.getTemplateId());
            }
            // 运费模板id
            if(!StringUtils.isEmpty(spu.getFreightId())){
                    criteria.andEqualTo("freightId",spu.getFreightId());
            }
            // 图片
            if(!StringUtils.isEmpty(spu.getImage())){
                    criteria.andEqualTo("image",spu.getImage());
            }
            // 图片列表
            if(!StringUtils.isEmpty(spu.getImages())){
                    criteria.andEqualTo("images",spu.getImages());
            }
            // 售后服务
            if(!StringUtils.isEmpty(spu.getSaleService())){
                    criteria.andEqualTo("saleService",spu.getSaleService());
            }
            // 介绍
            if(!StringUtils.isEmpty(spu.getIntroduction())){
                    criteria.andEqualTo("introduction",spu.getIntroduction());
            }
            // 规格列表
            if(!StringUtils.isEmpty(spu.getSpecItems())){
                    criteria.andEqualTo("specItems",spu.getSpecItems());
            }
            // 参数列表
            if(!StringUtils.isEmpty(spu.getParaItems())){
                    criteria.andEqualTo("paraItems",spu.getParaItems());
            }
            // 销量
            if(!StringUtils.isEmpty(spu.getSaleNum())){
                    criteria.andEqualTo("saleNum",spu.getSaleNum());
            }
            // 评论数
            if(!StringUtils.isEmpty(spu.getCommentNum())){
                    criteria.andEqualTo("commentNum",spu.getCommentNum());
            }
            // 是否上架,0已下架，1已上架
            if(!StringUtils.isEmpty(spu.getIsMarketable())){
                    criteria.andEqualTo("isMarketable",spu.getIsMarketable());
            }
            // 是否启用规格
            if(!StringUtils.isEmpty(spu.getIsEnableSpec())){
                    criteria.andEqualTo("isEnableSpec",spu.getIsEnableSpec());
            }
            // 是否删除,0:未删除，1：已删除
            if(!StringUtils.isEmpty(spu.getIsDelete())){
                    criteria.andEqualTo("isDelete",spu.getIsDelete());
            }
            // 审核状态，0：未审核，1：已审核，2：审核不通过
            if(!StringUtils.isEmpty(spu.getStatus())){
                    criteria.andEqualTo("status",spu.getStatus());
            }
        }
        return example;
    }

    /**
     * 删除
     * @param id
     */
    @Override
    public void delete(Long id){
        spuMapper.deleteByPrimaryKey(id);
    }

    /**
     * 修改Spu
     * @param spu
     */
    @Override
    public void update(Spu spu){
        spuMapper.updateByPrimaryKey(spu);
    }

    /**
     * 增加Spu
     * @param spu
     */
    @Override
    public void add(Spu spu){
        spuMapper.insert(spu);
    }

    /**
     * 根据ID查询Spu
     * @param id
     * @return
     */
    @Override
    public Spu findById(Long id){
        return  spuMapper.selectByPrimaryKey(id);
    }

    /**
     * 查询Spu全部数据
     * @return
     */
    @Override
    public List<Spu> findAll() {
        return spuMapper.selectAll();
    }
}
